﻿using Framework.Modelo;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Reflection;
using System.Collections.Generic;
using Rhino.Mocks;
using Framework.Atributos;
using System.Collections.ObjectModel;

namespace FrameworkTest.ModeloTest
{
    [TestClass()]
    public class ReflectionTest
    {
        private TestContext testContextInstance;

        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        [TestMethod()]
        public void ObtenerPropiedadesTestWithNull()
        {
            IObjeto objeto = null;
            Collection<PropertyInfo> actual;
            actual = Reflection.ObtenerPropiedades(objeto);
            Assert.IsNotNull(actual);
            Assert.IsTrue(actual.Count == 0);
        }

        [TestMethod()]
        public void ObtenerPropiedadesTestWithInstance()
        {
            IObjeto objeto = new Objeto();
            Collection<PropertyInfo> actual;
            actual = Reflection.ObtenerPropiedades(objeto);
            Assert.IsNotNull(actual);
            Assert.IsTrue(actual.Count > 0);
        }

        [TestMethod()]
        public void SePuedeConvertirTestWithInstancePersistable()
        {
            List<object> atributos = new List<object>();
            PersistenciaAttribute atributo = new PersistenciaAttribute();
            atributos.Add(atributo);
            PropertyInfo pi = MockRepository.GenerateStub<PropertyInfo>();
            pi.Expect(s => s.GetCustomAttributes(typeof(PersistenciaAttribute), true)).Repeat.Once().Return(atributos.ToArray());
            bool expected = true;
            bool actual;
            actual = Reflection.SePuedeConvertir(pi);
            Assert.AreEqual(expected, actual);
            pi.VerifyAllExpectations();
        }

        [TestMethod()]
        public void EqualsTestWithEquals()
        {
            IObjeto objeto1 = new Objeto();
            IObjeto objeto2 = objeto1;
            bool actual;
            actual = Reflection.Equals( objeto1, objeto2 );
            Assert.IsTrue( actual );
        }

        [TestMethod()]
        public void EqualsTestWithDiferent()
        {
            IObjeto objeto1 = new Objeto();
            IObjeto objeto2 = new Objeto();
            bool actual;
            actual = Reflection.Equals( objeto1, objeto2 );
            Assert.IsFalse( actual );
        }

        [TestMethod()]
        public void SePuedeConvertirTest()
        {
            PropertyInfo pi = null; 
            bool actual;
            actual = Reflection.SePuedeConvertir( pi );
            Assert.IsFalse( actual );
        }
    }
}
